<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  
  <title>Hexo</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="description" content="\Tomcat 专题部分**1.1简述Tomcat答：Tomcat 服务器Apache软件基金会项目中的一个核心项目，是一个免费的开放源代码的Web 应用服务器，属于轻量级应用服务器，在中小型系统和并发访问用户不是很多的场合下被普遍使用，是开发和调试JSP 程序的首选。1.2如何修改Tomcat的缺省端口答：如下操作1.找到Tomcat目录下的conf文件夹2.进入conf文件夹里面找到serve">
<meta property="og:type" content="article">
<meta property="og:title" content="Hexo">
<meta property="og:url" content="https://goofyer.gitee.io/notes-on-computer-expertise/2022/02/21/Spring%E5%BC%80%E5%8F%91/tomcat/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:description" content="\Tomcat 专题部分**1.1简述Tomcat答：Tomcat 服务器Apache软件基金会项目中的一个核心项目，是一个免费的开放源代码的Web 应用服务器，属于轻量级应用服务器，在中小型系统和并发访问用户不是很多的场合下被普遍使用，是开发和调试JSP 程序的首选。1.2如何修改Tomcat的缺省端口答：如下操作1.找到Tomcat目录下的conf文件夹2.进入conf文件夹里面找到serve">
<meta property="og:locale" content="en_US">
<meta property="article:published_time" content="2022-02-21T12:33:44.746Z">
<meta property="article:modified_time" content="2022-02-21T12:35:06.592Z">
<meta property="article:author" content="John Doe">
<meta name="twitter:card" content="summary">
  
    <link rel="alternate" href="/notes-on-computer-expertise/atom.xml" title="Hexo" type="application/atom+xml">
  
  
    <link rel="shortcut icon" href="/notes-on-computer-expertise/favicon.png">
  
  
    
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/typeface-source-code-pro@0.0.71/index.min.css">

  
  
<link rel="stylesheet" href="/notes-on-computer-expertise/css/style.css">

  
    
<link rel="stylesheet" href="/notes-on-computer-expertise/fancybox/jquery.fancybox.min.css">

  
<meta name="generator" content="Hexo 5.4.0"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/notes-on-computer-expertise/" id="logo">Hexo</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/notes-on-computer-expertise/">Home</a>
        
          <a class="main-nav-link" href="/notes-on-computer-expertise/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/notes-on-computer-expertise/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="https://goofyer.gitee.io/notes-on-computer-expertise"></form>
      </div>
    </div>
  </div>
</header>

      <div class="outer">
        <section id="main"><article id="post-Spring开发/tomcat" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
  <div class="article-meta">
    <a href="/notes-on-computer-expertise/2022/02/21/Spring%E5%BC%80%E5%8F%91/tomcat/" class="article-date">
  <time class="dt-published" datetime="2022-02-21T12:33:44.746Z" itemprop="datePublished">2022-02-21</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
    <div class="e-content article-entry" itemprop="articleBody">
      
        <h1 id="Tomcat-专题部分"><a href="#Tomcat-专题部分" class="headerlink" title="\Tomcat 专题部分**"></a><strong><em>\</em>Tomcat 专题部分**</strong></h1><p>1.1简述Tomcat<br>答：Tomcat 服务器Apache软件基金会项目中的一个核心项目，是一个免费的开放源代码的Web 应用服务器，属于轻量级应用服务器，在中小型系统和并发访问用户不是很多的场合下被普遍使用，是开发和调试JSP 程序的首选。<br>1.2如何修改Tomcat的缺省端口<br>答：如下操作<br>1.找到Tomcat目录下的conf文件夹<br>2.进入conf文件夹里面找到server.xml文件<br>3.打开server.xml文件<br>4.在server.xml文件里面找到下列信息<br>5.把Connector标签的8080端口改成你想要的端口<br>1.3Tomcat 有几种Connector 运行模式<br>答：Tomcat Connector的三种运行模式。<br>BIO：同步并阻塞 一个线程处理一个请求。缺点：并发量高时，线程数较多，浪费资源。Tomcat7或以下，在Linux系统中默认使用这种方式。配制项：protocol=”HTTP/1.1”<br>NIO：同步非阻塞IO,利用Java的异步IO处理，可以通过少量的线程处理大量的请求，可以复用同一个线程处理多个connection(多路复用)。Tomcat8在Linux系统中默认使用这种方式。<br>备注：常用的Jetty，Mina，ZooKeeper等都是基于java nio实现.<br>APR：即Apache Portable Runtime，从操作系统层面解决io阻塞问题。<br>AIO方式，异步非阻塞IO(Java NIO2又叫AIO) 主要与NIO的区别主要是操作系统的底层区别.可以做个比喻:比作快递，NIO就是网购后要自己到官网查下快递是否已经到了(可能是多次)，然后自己去取快递；AIO就是快递员送货上门了(不用关注快递进度)。<br>配制项：protocol=”org.apache.coyote.http11.Http11AprProtocol”<br>备注：需在本地服务器安装APR库。Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。Linux如果安装了apr和native，Tomcat直接启动就支持apr。<br>1.4Tomcat有几种部署方式？<br>答：在Tomcat中部署Web应用的方式主要有如下几种：<br>1.利用Tomcat的自动部署。<br>把web应用拷贝到webapps目录。Tomcat在启动时会加载目录下的应用，并将编译后的结果放入work目录下。<br>2.使用Manager App控制台部署。<br>在tomcat主页点击“Manager App” 进入应用管理控制台，可以指定一个web应用的路径或war文件。<br>3.修改conf/server.xml文件部署。<br>修改conf/server.xml文件，增加Context节点可以部署应用。<br>4.增加自定义的Web部署文件。<br>在conf/Catalina/localhost/ 路径下增加 xyz.xml文件，内容是Context节点，可以部署应用。<br>1.5简述Tomcat容器是如何创建servlet类实例？<br>答：<br>1.当容器启动时，会读取在webapps目录下所有的web应用中的web.xml文件，然后对 xml文件进行解析，并读取servlet注册信息。然后，将每个应用中注册的servlet类都进行加载，并通过反射的方式实例化。（有时候也是在第一次请求时实例化）<br>2.在servlet注册时加上1如果为正数，则在一开始就实例化，如果不写或为负数，则第一次请求实例化。<br>1.6简述Tomcat工作模式<br>答：Tomcat作为servlet容器，有三种工作模式：<br>1、独立的servlet容器，servlet容器是web服务器的一部分；<br>2、进程内的servlet容器，servlet容器是作为web服务器的插件和java容器的实现，web服务器插件在内部地址空间打开一个jvm使得java容器在内部得以运行。反应速度快但伸缩性不足；<br>3、进程外的servlet容器，servlet容器运行于web服务器之外的地址空间，并作为web服务器的插件和java容器实现的结合。反应时间不如进程内但伸缩性和稳定性比进程内优；<br>进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类：<br>Tomcat作为应用程序服务器：请求来自于前端的web服务器，这可能是Apache, IIS, Nginx等；<br>Tomcat作为独立服务器：请求来自于web浏览器；<br>面试时问到Tomcat相关问题的几率并不高，正式因为如此，很多人忽略了对Tomcat相关技能的掌握，下面这一篇文章整理了Tomcat相关的系统架构，介绍了Server、Service、Connector、Container之间的关系，各个模块的功能，可以说把这几个掌握住了，Tomcat相关的面试题你就不会有任何问题了！另外，在面试的时候你还要有意识无意识的往Tomcat这个地方引，就比如说常见的SpringMVC的执行流程，一个URL的完整调用链路，这些相关的题目你是可以往Tomcat处理请求的这个过程去说的！<br> Server、Service、Connector、Container四大组件之间的关系和联系，以及他们的主要功能点；<br> Tomcat执行的整体架构，请求是如何被一步步处理的；<br> Engine、Host、Context、Wrapper相关的概念关系；<br> Container是如何处理请求的；<br> Tomcat用到的相关设计模式；<br>1.7Tomcat顶层架构<br>Tomcat的结构很复杂，但是Tomcat非常的模块化，找到了 Tomcat 最核心的模块，问题才可以游刃而解，了解了Tomcat的整体架构对以后深入了解 Tomcat 来说至关重要！</p>
<p>Tomcat中最顶层的容器是Server，代表着整个服务器，从上图中可以看出，一个Server可以包含至少一个Service，即可以包含多个Service，用于具体提供服务。<br>Service主要包含两个部分：Connector和Container。从上图中可以看出 Tomcat 的心脏就是这两个组件，他们的作用如下：<br>Connector用于处理连接相关的事情，并提供Socket与Request请求和Response响应相关的转化;<br>Container用于封装和管理Servlet，以及具体处理Request请求；<br>一个Tomcat中只有一个Server，一个Server可以包含多个Service，一个Service只有一个Container，但是可以有多个Connectors，这是因为一个服务可以有多个连接，如同时提供Http和Https链接，也可以提供向相同协议不同端口的连接，示意图如下（Engine、Host、Context下面会说到）</p>
<p>多个 Connector 和一个 Container 就形成了一个 Service，有了 Service 就可以对外提供服务了，但是 Service 还要一个生存的环境，必须要有人能够给她生命、掌握其生死大权，那就非 Server 莫属了！所以整个 Tomcat 的生命周期由 Server 控制。<br>另外，上述的包含关系或者说是父子关系，都可以在tomcat的conf目录下的server.xml配置文件中看出。<br>1.8Tomcat顶层架构小结<br>1.Tomcat中只有一个Server，一个Server可以有多个Service，一个Service可以有多个Connector和一个Container；<br>2.Server掌管着整个Tomcat的生命周期；<br>3.Service 是对外提供服务的；<br>4.Connector用于接受请求并将请求封装成Request和Response来具体处理；<br>5.Container用于封装和管理Servlet，以及具体处理request请求；<br>知道了整个Tomcat顶层的分层架构和各个组件之间的关系以及作用，对于绝大多数的开发人员来说Server和Service对我们来说确实很远，而我们开发中绝大部分进行配置的内容是属于Connector和Container的，所以接下来介绍一下Connector和Container。<br>1.9Connector和Container的微妙关系<br>由上述内容我们大致可以知道一个请求发送到Tomcat之后，首先经过Service然后会交给我们的Connector，Connector用于接收请求并将接收的请求封装为Request和Response来具体处理，Request和Response封装完之后再交由Container进行处理，Container处理完请求之后再返回给Connector，最后在由Connector通过Socket将处理的结果返回给客户端，这样整个请求的就处理完了！<br>Connector最底层使用的是Socket来进行连接的，Request和Response是按照HTTP协议来封装的，所以Connector同时需要实现TCP/IP协议和HTTP协议！<br>Tomcat既然需要处理请求，那么肯定需要先接收到这个请求，接收请求这个东西我们首先就需要看一下Connector！<br>第二章Spring Cloud 专题部分<br>2.1简述微服务与SOA架构的区别<br>答：</p>
<p>2.2简述Spring Cloud<br>答：Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发，如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等，都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子，它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来，通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理，最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。<br>2.3简述Spring Cloud 治理组件<br>答：Spring Cloud Alibaba 为微服务开发提供了一站式解决方案。它包含了开发分布式应用微服务的必需组件，方便您通过 Spring Cloud 框架来开发分布式应用服务。借助 Spring Cloud Alibaba，您只需要添加一些注解和少量配置，就可以将 Spring Cloud 应用接入Alibaba微服务解决方案，通过Alibaba中间件来迅速搭建分布式应用系统。<br>2.3.1Nacos<br>致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单有用的特性集，帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。<br>（Nacos is committed to help you discover, configure, and manage your microservices. It provides a set of simple and useful features enabling you to realize dynamic service discovery, service configuration, service metadata and traffic management.）<br>Nacos 到目前为止，最新版是2.0.3</p>
<p>2.3.2Spring Cloud Gateway<br>Spring Cloud Gateway 作为 MicroServices 整套解决落地方案——Spring Cloud 生态系统中的网关，它的作用是协议适配、协议转发、路由、过滤，与权限配合，还可以完成认证和授权的功能，它是整个MicroServices的接入端，Spring Cloud Gateway为了实现High Performance，从它的官网看，底层依赖了Reactor Netty。就是说底层使用了Netty框架，而不是别的如传统的tomcat等中间件。但如果在Spring Cloud Gateway 网关项目中引入tomcat呢？结果怎样呢？答案是非常清晰的，会发生Direct Memory(堆外内存)异常。<br>Spring Cloud Gateway依赖Spring Boot和Spring Webflux提供的Netty runtime。它不能在传统的Servlet容器中工作或构建为WAR。<br>2.3.3Spring Cloud OpenFeign<br>基于Ribbon和Hystrix的声明式服务调用组件，可以动态创建基于Spring MVC注解的接口实现用于服务调用，在Spring Cloud 2.0以后版本已经取代Netflix Feign.<br>2.3.4Netflix Ribbon<br>负载均衡的服务调用组件，具有多种负载均衡调用策略.<br>2.3.5Netflix Hystrix<br>服务容错组件，实现了断路器模式，为依赖服务的出错和延迟提供了容错能力.<br>2.3.6 Spring Cloud Bus<br>用于传播集群状态变化的消息总线，使用轻量级消息代理链接分布式系统中的节点，可以用来动态刷新集群中的服务配置</p>
<p>2.3.7Sentinel<br>是alibaba开源的一个限流方案框架,Sentinel可以整合Spring Cloud gateway做限流，而且Sentinel支持把规则数据存到Redis中.<br>1.随着微服务系统越来越流行，服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点，从流量控制、流量整形、熔断降级和系统负载保护等多个维度保护微服务的稳定性。<br>（As distributed systems become increasingly popular, the reliability between services is becoming more important than ever before. Sentinel takes “flow” as breakthrough point, and works on multiple fields including flow control, traffic shaping, circuit breaking and system adaptive protection, to guarantee reliability and resilience for microservices.）<br>2.丰富的应用场景：Sentinel 承接了阿里巴巴近10年的双十一大促流量的核心场景，例如秒杀（即突发流量控制在系统容量可以承受的范围）、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。<br>（Rich applicable scenarios: Sentinel has been wildly used in Alibaba, and has covered almost all the core-scenarios in Double-11 (11.11) Shopping Festivals in the past 10 years, such as “Second Kill” which needs to limit burst flow traffic to meet the system capacity, message peak clipping and valley fills, circuit breaking for unreliable downstream services, cluster flow control, etc.）</p>
<ol>
<li>完备的实时监控：Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据，甚至500台以下规模的集群的汇总运行情况。<br>(Real-time monitoring: Sentinel also provides real-time monitoring ability. You can see the runtime information of a single machine in real-time, and the aggregated runtime info of a cluster with less than 500 nodes.)<br>4.广泛的开源生态：Sentinel 提供开箱即用的与其它开源框架/库的整合模块，例如与 Spring Cloud、Dubbo、gRPC 的整合。只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。<br>(Widespread open-source ecosystem: Sentinel provides out-of-box integrations with commonly-used frameworks and libraries such as Spring Cloud, Dubbo and gRPC. You can easily use Sentinel by simply add the adapter dependency to your services.）<br>2.3.8Apache RocketMQ<br>Apache RocketMQ™是一个标准的消息引擎，轻量级的数据处理平台。<br>Apache RocketMQ™ is a unified messaging engine, lightweight data processing platform.<br>1.RocketMQ架构上主要分为四部分。<br>The RocketMQ architecture is divided into four parts<br>2.消息发布者，支持分布式集群方式部署。Producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投递，投递的过程支持快速失败并且低延迟。<br>Producer：The role of message publishing supports distributed cluster mode deployment. Producer selects the corresponding Broker cluster queue for message delivery through MQ’s load balancing module. The delivery process supports fast failure and low latency.<br>3.消息消费的角色，支持分布式集群方式部署。支持以push推，pull拉两种模式对消息进行消费。同时也支持集群方式和广播方式的消费，它提供实时消息订阅机制，可以满足大多数用户的需求。<br>Consumer：The role of message consumption supports distributed cluster deployment. Support push, pull two modes to consume messages. It also supports cluster mode and broadcast mode consumption, and it provides a real-time message subscription mechanism to meet the needs of most users.<br>4.NameServer是一个非常简单的Topic路由注册中心，其角色类似Dubbo中的zookeeper，支持Broker的动态注册与发现。主要包括两个功能：Broker管理，NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。<br>NameServer：NameServer is a very simple Topic routing registry with a role similar to ZooKeeper in Dubbo, which supports dynamic registration and discovery of Broker. It mainly includes two functions: Broker management, NameServer accepts the registration information of the Broker cluster and saves it as the basic data of the routing information.<br>5.Broker主要负责消息的存储、投递和查询以及服务高可用保证<br>BrokerServer：Broker is responsible for the storage, delivery and query of messages and high availability guarantees.<br>Note：RocketMQ 是 Java语言编写的，如果能通读几遍它的代码，对我们能力的提升无疑是非常好的帮助。<br>消息队列，通常会简称为MQ(Message Queue)，它是支持高并发应用程序的利器，主要作用有流量削峰、异步通信、服务解耦等功能。<br>2.4简述Spring Boot和Spring Cloud区别<br>答：Spring Boot专注于快速方便的开发单个个体微服务。<br>Spring Cloud是关注全局的微服务协调治理框架，它将Spring Boot开发的各个单体微服务整合并管理起来，为各个微服务之间提供，配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务。<br>Spring Boot可以离开Spring Cloud独立使用开发项目， SpringCloud离不开Spring Boot ，属于依赖的关系。<br>Spring Boot专注于快速、方便的开发单个微服务个体，SpringCloud关注全局的服务治理框架。</li>
</ol>
<p>2.5简述服务注册和发现<br>答：当开始一个项目时，通常在属性文件中进行所有的配置。随着越来越多的服务开发和部署，添加和修改这些属性变得更加复杂。有些服务可能会下降，而某些位置可能会发生变化。手动更改属性可能会产生问题。Nacos服务注册和发现可以在这种情况下提供帮助。由于所有服务都在 Nacos 服务器上注册并通过调用 Nacos服务器完成查找，因此无需处理服务地点的任何更改和处理。<br>2.6简述Spring Cloud 和Dubbo区别<br>答：<br>1）服务调用方式：dubbo是RPC，Spring Cloud是Rest Api。<br>2）注册中心：Dubbo 是Zookeeper，Spring Cloud可以是Nacos或其他。<br>3）服务网关：dubbo本身没有实现，只能通过其他第三方技术整合，springcloud有Gateway路由网关，作为路由服务器，进行消费者的请求分发,Spring Cloud支持断路器，与git完美集成配置文件支持版本控制，事务总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素。<br>4）架构完整度：Spring Cloud包含诸多微服务组件要素，完整度上比Dubbo高。<br>2.7简述Hystrix(豪猪) 作用<br>答：<br>第三章Java知识专题部分<br>3.1简述JDK 和 JRE 区别<br>答：JDK：Java Development Kit 的简称，java 开发工具包，提供了 java 的开发环境和运行环境。<br>JRE：Java Runtime Environment 的简称，java 运行环境，为 java 的运行提供了所需环境。<br>具体来说 JDK 其实包含了 JRE，同时还包含了编译 java 源码的编译器 javac，还包含了很多 java 程序调试和分析的工具。简单来说：如果你需要运行 java 程序，只需安装 JRE 就可以了，如果你需要编写 java 程序，需要安装 JDK。<br>3.2两个对象的 hashCode()相同，则 equals()也一定为 true？<br>答：不对，两个对象的 hashCode()相同，equals()不一定 true。<br>3.3简述final 在java中作用<br>答：<br>final 修饰的类叫最终类，该类不能被继承。<br>final 修饰的方法不能被重写。<br>final 修饰的变量叫常量，常量必须初始化，初始化之后值就不能被修改。<br>3.4简述Java基础类型，String 属于基础类型吗<br>答：基础类型有 8 种：byte、boolean、char、short、int、float、long、double。<br>String 不属于基础类型。<br>3.5简述java 中操作字符串都有哪些类？它们之间有什么区别？在多线程环境下应如何应用？<br>答：操作字符串的类有：String、StringBuffer、StringBuilder。<br>String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象，每次操作都会生成新的 String 对象，然后将指针指向新的 String 对象，而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作，所以在经常改变字符串内容的情况下最好不要使用 String。<br>StringBuffer 和 StringBuilder 最大的区别在于，StringBuffer 是线程安全的，而 StringBuilder 是非线程安全的，但 StringBuilder 的性能却高于 StringBuffer，所以在单线程环境下推荐使用 StringBuilder，多线程环境下推荐使用 StringBuffer。<br>3.6Java抽象类必须要有抽象方法吗？抽象类能使用 final 修饰吗？抽象类可以被实例化吗？<br>答：1、不需要，抽象类不一定非要有抽象方法。<br>2、不能，定义抽象类就是让其他类继承的，如果定义为 final 该类就不能被继承，这样彼此就会产生矛盾，所以 final 不能修饰抽象类。<br>3、抽象类不能被实例化。<br>3.7Java 中 IO 流分为几种？图片和媒体文件应该用什么流处理？<br>答：1、按功能来分：输入流（input）、输出流（output）。<br>按类型来分：字节流和字符流。<br>字节流和字符流的区别是：字节流按 8 位传输以字节为单位输入输出数据，字符流按 16 位传输以字符为单位输入输出数据。<br>2、图片和媒体文件用字节流处理。<br>3.8Java中BIO、NIO、AIO 有什么区别？<br>答：<br>BIO：Block IO 同步阻塞式 IO，就是我们平常使用的传统 IO，它的特点是模式简单使用方便，并发处理能力低。<br>NIO：Non-blocking IO 同步非阻塞 IO，是传统 IO 的升级，客户端和服务器端通过 Channel（通道）通讯，实现了多路复用。<br>AIO：Asynchronous IO 是 NIO 的升级，也叫 NIO2，实现了异步非堵塞 IO ，异步 IO 的操作基于事件和回调机制。<br>3.9Java集合Collection 和 Collections 有何区别？<br>答：<br>java.util.Collection 是一个集合接口（集合类的一个顶级接口）。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式，其直接继承接口有List与Set。<br>Collections则是集合类的一个工具类/帮助类，其中提供了一系列静态方法，用于对集合中元素进行排序、搜索以及线程安全等各种操作。<br>3.10Java 中ArrayList 和 LinkedList 的区别<br>答：区别是 ArrrayList底层的数据结构是数组，支持随机访问，而 LinkedList 的底层数据结构是双向循环链表，不支持随机访问。使用下标访问一个元素，ArrayList 的时间复杂度是 O(1)，而 LinkedList 是 O(n)。<br>第四章Spring Boot 专题部分<br>4.1Spring Boot 对全局的配置文件，可以对属性进行读取操作，有几种方法？<br>答：通常有三种方法<br>通过 @value(“${}”) 注解进行自动注入<br>继承 EnvironmentAware 获取 Environment<br>在类文件中注入 Environment 实例<br>4.2向Spring IOC容器注入类有几种方法<br>答：通常有两种方法：<br>1、以xml方式向IOC容器注入类；<br>可以新建一个beans.xml文件，在此文件中，写入bean 标签，包括id和class<br>以SecondService类为例，但不要在SecondService类名上加@Service<br>@ImportResource<br>导入Spring的配置文件，让配置文件里面的bean生效；<br>Spring Boot项目想加载Spring的配置文件，需要此注解加载进来；<br>注意：@ImportResource需标注在一个配置类上<br>2、以注解方式向IOC容器注入类。<br>@Configuration 在Spring Boot的配置类名上，加入此注解；表示此类就是一个配置<br>类，且被加载到Spring IOC 容器中。<br>@Bean 在Spring Boot的配置类中的方法上，加入此注解；表示要实例化此类的对象，且被加载到Spring IOC 容器中。<br>4.3简述Spring IOC 容器是用什么数据类型实现的<br>答：是用ConcurrentHashMap实现的。实现了线程安全。在DefaultListableBeanFactory<br>类中使用了通过registerBeanDefinition方法把类加入到容器中。</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://goofyer.gitee.io/notes-on-computer-expertise/2022/02/21/Spring%E5%BC%80%E5%8F%91/tomcat/" data-id="cl403sxqr000mf8vu89dh4bow" data-title="" class="article-share-link">Share</a>
      
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/notes-on-computer-expertise/2022/02/21/Spring%E5%BC%80%E5%8F%91/%E7%BB%83%E4%B9%A0%E9%A2%98/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          (no title)
        
      </div>
    </a>
  
  
    <a href="/notes-on-computer-expertise/2022/02/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E7%AC%AC%E4%B8%83%E7%AB%A0%20%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E7%B3%BB%E7%BB%9F/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title"></div>
    </a>
  
</nav>

  
</article>


</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Categories</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/C-%E5%B7%A5%E5%85%B7/">C#工具</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/C-%E5%B7%A5%E5%85%B7/">C++工具</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/Mysql/">Mysql</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/blender/">blender</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/linux/">linux</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/manim/">manim</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/spring/">spring</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/vba%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/">vba基础操作</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E5%88%9B%E9%80%A0%E6%A8%A1%E5%BC%8F/">创造模式</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/">操作系统</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/">操作系统基础知识</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91/">操作系统开发</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%95%B0%E5%AD%A6/">数学</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/">数据结构</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/">数据结构基础知识</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%A8%A1%E6%9D%BF/">模板</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/">深度学习</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%8B%B1%E8%AF%AD/">英语</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%99%9A%E5%B9%BB4/">虚幻4</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/">计算机组成原理</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/">计算机网络</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tags</h3>
    <div class="widget">
      <ul class="tag-list" itemprop="keywords"><li class="tag-list-item"><a class="tag-list-link" href="/notes-on-computer-expertise/tags/C/" rel="tag">C++</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tag Cloud</h3>
    <div class="widget tagcloud">
      <a href="/notes-on-computer-expertise/tags/C/" style="font-size: 10px;">C++</a>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/05/">May 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/03/">March 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/02/">February 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/01/">January 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2021/12/">December 2021</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/31/vue/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6%E9%AA%8C%E8%AF%81%E7%A0%81%E6%97%A0%E6%B3%95%E6%98%BE%E7%A4%BA/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/26/%E6%95%B0%E6%8D%AE%E5%BA%93/navicat%E5%AE%89%E8%A3%85/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/25/%E8%99%9A%E5%B9%BB4%E5%BC%95%E6%93%8E%E5%BC%80%E5%8F%91/%E8%99%9A%E5%B9%BB%E5%9B%9B%20mod%E5%88%B6%E4%BD%9C/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/23/python/python%E6%89%B9%E9%87%8F%E7%94%9F%E6%88%90%E6%95%B0%E6%8D%AE/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/23/vba%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C%E7%AC%94%E8%AE%B0/EXCEL%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/">(no title)</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      
      &copy; 2022 John Doe<br>
      Powered by <a href="https://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>

    </div>
    <nav id="mobile-nav">
  
    <a href="/notes-on-computer-expertise/" class="mobile-nav-link">Home</a>
  
    <a href="/notes-on-computer-expertise/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    


<script src="/notes-on-computer-expertise/js/jquery-3.4.1.min.js"></script>



  
<script src="/notes-on-computer-expertise/fancybox/jquery.fancybox.min.js"></script>




<script src="/notes-on-computer-expertise/js/script.js"></script>





  </div>
<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
        tex2jax: {
            inlineMath: [ ["$","$"], ["\\(","\\)"] ],
            skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'],
            processEscapes: true
        }
    });
    MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax();
        for (var i = 0; i < all.length; ++i)
            all[i].SourceElement().parentNode.className += ' has-jax';
    });
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML"></script>
</body>
</html>